home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / comm / ox.zip / OX.ASM < prev    next >
Assembly Source File  |  1987-07-06  |  8KB  |  430 lines

  1.     page    60,132
  2.     title    AuxDrv - Monochrome AUX driver
  3.  
  4. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5.  
  6. ; This device directs AUX output to the Monochrome display, and AUX input to
  7. ; the BIOS.  At boot time, it saves the vectors for INT 9 and INT 16h, and
  8. ; when AUX input is requested temporarily restores them.  So, it can be used
  9. ; for AUX input and output from inside Windows.
  10.  
  11. ; You should still use the /M option with SymDeb rather than /"=AUX", because
  12. ; SymDeb has a bug where it puts out memory allocation messages to CON even
  13. ; though you said /"=AUX".
  14.  
  15. ; It's also handy in DOS; you can do, for example, TYPE FOO >AUX and it will
  16. ; go to the Monochrome screen.    You can even say CTTY AUX if you don't feel
  17. ; like saying MODE MONO...
  18.  
  19. ; In case you're wondering why the screen output code is so simple (i.e. there
  20. ; is no "current row" variable), it always outputs to the last row of the
  21. ; screen, instead of starting at the top.  Don't laugh, it works fine and made
  22. ; it easier to code this pup.
  23.  
  24. ; This driver is in the public domain.    If you find it useful, how about
  25. ; returning the favor and putting some of your own favorite utilities in
  26. ; the public domain, too?  (***with source code!!!***)
  27.  
  28. ; Michael Geary (GEnie: GEARY; BIX: GEARY; CompuServe: 76146,42)
  29.  
  30. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  31.  
  32. ; Far return so we don't have to use PROCs
  33.  
  34. retf    MACRO
  35.     db    0CBh
  36.     ENDM
  37.  
  38. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  39.  
  40. ; request header entries
  41.  
  42. cmdCode     equ    2
  43. status        equ    3
  44.  
  45. ndInputChar    equ    13
  46.  
  47. brkOff        equ    14
  48. brkSeg        equ    brkOff+2
  49.  
  50. xferOff     equ    14
  51. xferSeg     equ    xferOff+2
  52.  
  53. xferCount    equ    18
  54.  
  55. ; constants
  56.  
  57. BS        equ    08h
  58. TAB        equ    09h
  59. LF        equ    0Ah
  60. CR        equ    0Dh
  61.  
  62. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  63.  
  64. Zseg        segment at 0
  65.  
  66.         org     9*4
  67. KbdInt        label   dword
  68. KbdIntOff   dw        ?
  69. KbdIntSeg   dw        ?
  70.  
  71.         org     16h*4
  72. KbdBios     label   dword
  73. KbdBiosOff  dw        ?
  74. KbdBiosSeg  dw        ?
  75.  
  76. Zseg        endS
  77.  
  78. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  79.  
  80. Cseg    segment para public 'code'
  81.  
  82.         assume    cs:Cseg, ds:nothing, es:nothing
  83. begin:
  84.  
  85. ; device driver header
  86.  
  87. nextDev     dd    -1
  88. attribute    dw    1000100000000000b
  89. strategy    dw    devStrategy
  90. interrupt    dw    devInt
  91. devName     db    'AUX     '
  92.  
  93. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  94.  
  95. rhAddr        label    dword
  96. rhOff        dw    ?
  97. rhSeg        dw    ?
  98.  
  99. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  100.  
  101. funTab        label    word
  102.         dw    init
  103.         dw    mediaCheck
  104.         dw    buildBpb
  105.         dw    ioCtlIn
  106.         dw    input
  107.         dw    ndInput
  108.         dw    inStat
  109.         dw    inFlush
  110.         dw    output
  111.         dw    outVerify
  112.         dw    outStat
  113.         dw    outFlush
  114.         dw    ioCtlOut
  115.         dw    open
  116.         dw    close
  117.  
  118. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  119.  
  120. scrMinOff    equ    160*24
  121. scrMaxOff    equ    160*25
  122.  
  123. scrCurOff    dw    scrMinOff
  124.         dw    0B000h
  125.  
  126. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  127.  
  128. SaveKbdInt    label    dword
  129. SaveKbdIntOff    dw    0
  130. SaveKbdIntSeg    dw    0
  131.  
  132. SaveKbdBios    label    dword
  133. SaveKbdBiosOff    dw    0
  134. SaveKbdBiosSeg    dw    0
  135.  
  136. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  137.  
  138. devStrategy:
  139.     mov    cs:rhSeg, es
  140.     mov    cs:rhOff, bx
  141.     retf
  142.  
  143. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  144.  
  145. devInt:
  146.     pushf
  147.     push    ds
  148.     push    es
  149.     push    ax
  150.     push    bx
  151.     push    cx
  152.     push    dx
  153.     push    di
  154.     push    si
  155.     cld
  156.  
  157.     les    bx, cs:rhAddr
  158.     mov    al, es:[bx].cmdCode
  159.     shl    al, 1
  160.     lea    di, funTab
  161.     xor    ah, ah
  162.     add    di, ax
  163.     jmp    word ptr[di]
  164.  
  165. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  166.  
  167. outVerify:
  168. output:
  169.     mov    cx, es:[bx].xferCount    ; CX = # bytes to write
  170.     lds    si, es:[bx].xferOff    ; DS:SI --> text
  171.  
  172.     les    di, dword ptr scrCurOff
  173.  
  174. outLoop:
  175.     lodsb
  176.  
  177.     cmp    al, CR
  178.     ja    outChar
  179.     je    outCR
  180.  
  181.     cmp    al, LF
  182.     je    outLF
  183.  
  184.     cmp    al, TAB
  185.     je    outTAB
  186.  
  187.     cmp    al, BS
  188.     je    outBS
  189.  
  190. outChar:
  191.     stosb
  192.     inc    di
  193.     cmp    di, scrMaxOff
  194.     jb    outDone
  195.  
  196.     mov    di, scrMinOff
  197.  
  198. outLF:
  199.     push    ds
  200.     push    es
  201.     push    si
  202.     push    di
  203.     push    cx
  204.  
  205.     mov    ax, es
  206.     mov    ds, ax
  207.  
  208.     xor    di, di            ; Scroll screen
  209.     mov    si, 160
  210.     mov    cx, 24*80
  211.     rep movsw
  212.  
  213.     mov    ax, 0720h        ; Blank bottom line
  214.     mov    cx, 80
  215.     rep stosw
  216.  
  217.     pop    cx
  218.     pop    di
  219.     pop    si
  220.     pop    es
  221.     pop    ds
  222.  
  223.     jmp    outDone
  224.  
  225. outBS:
  226.     cmp    di, scrMinOff
  227.     je    outDone
  228.     sub    di, 2
  229.     jmp    outDone
  230.  
  231. outTAB:
  232.     or    di, 0Eh
  233.     add    di, 2
  234.     jmp    outDone
  235.  
  236. outCR:
  237.     mov    di, scrMinOff
  238.  
  239. outDone:
  240.     loop    outLoop
  241.     mov    scrCurOff, di
  242.  
  243.     mov    dx, 3B4h
  244.     shr    di, 1            ; Set cursor position
  245.     mov    ax, di
  246.     mov    al, 0Eh
  247.     out    dx, ax
  248.     mov    ax, di
  249.     xchg    ah, al
  250.     mov    al, 0Fh
  251.     out    dx, ax
  252.  
  253.     jmp    exit
  254.  
  255. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  256.  
  257. input:
  258.     call    SwapKbdInts
  259.  
  260.     mov    ah, 0
  261.     int    16h
  262.  
  263.     les    di, es:[bx].xferOff    ; ES:DI --> text
  264.     stosb
  265.     mov    byte ptr es:[bx].xferCount, 1
  266.  
  267.     call    SwapKbdInts
  268.  
  269.     jmp    exit
  270.  
  271. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  272.  
  273. ndInput:
  274.     call    SwapKbdInts
  275.  
  276.     mov    ah, 1
  277.     int    16h
  278.     jz    ndInputNone
  279.  
  280.     mov    es:[bx].ndInputChar, al
  281.  
  282.     call    SwapKbdInts
  283.  
  284.     jmp    exit
  285.  
  286. ndInputNone:
  287.     call    SwapKbdInts
  288.  
  289.     les    bx, rhAddr
  290.     or    word ptr es:status[bx], 0300h    ; set busy flag
  291.  
  292.     jmp    exit1
  293.  
  294. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  295.  
  296. inStat:
  297.     call    SwapKbdInts
  298.  
  299.     mov    ah, 1
  300.     int    16h
  301.     jz    ndInputNone
  302.  
  303.     call    SwapKbdInts
  304.  
  305.     jmp    exit
  306.  
  307. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  308.  
  309. inFlush:
  310.     call    SwapKbdInts
  311.  
  312. inFlushLoop:
  313.     mov    ah, 1
  314.     int    16h
  315.     jz    inFlushDone
  316.  
  317.     mov    ah, 0
  318.     int    16h
  319.     jmp    inFlushLoop
  320.  
  321. inFlushDone:
  322.     call    SwapKbdInts
  323.  
  324.     jmp    exit
  325.  
  326. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  327.  
  328. open:
  329.     mov    dx, 3B4h        ; Set standard monochrome cursor
  330.     mov    ax, 0B0Ah
  331.     out    dx, ax
  332.     mov    ax, 0C0Bh
  333.     out    dx, ax
  334.  
  335. close:
  336.     jmp    exit
  337.  
  338. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  339.  
  340. mediaCheck:
  341. buildBpb:
  342. ioCtlIn:
  343. ioCtlOut:
  344. outStat:
  345. outFlush:
  346.  
  347. exit:
  348.     les    bx, rhAddr
  349.     or    word ptr es:status[bx], 0100h
  350. exit1:
  351.     pop    si
  352.     pop    di
  353.     pop    dx
  354.     pop    cx
  355.     pop    bx
  356.     pop    ax
  357.     pop    es
  358.     pop    ds
  359.     popf
  360.     retf
  361.  
  362. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  363.  
  364. SwapKbdInts:
  365.  
  366.     push    es
  367.     push    ax
  368.     xor    ax, ax
  369.     mov    es, ax
  370.     assume    es:Zseg
  371.  
  372.     CLI
  373.  
  374.     mov    ax, SaveKbdIntOff
  375.     xchg    ax, KbdIntOff
  376.     mov    SaveKbdIntOff, ax
  377.  
  378.     mov    ax, SaveKbdIntSeg
  379.     xchg    ax, KbdIntSeg
  380.     mov    SaveKbdIntSeg, ax
  381.  
  382.     mov    ax, SaveKbdBiosOff
  383.     xchg    ax, KbdBiosOff
  384.     mov    SaveKbdBiosOff, ax
  385.  
  386.     mov    ax, SaveKbdBiosSeg
  387.     xchg    ax, KbdBiosSeg
  388.     mov    SaveKbdBiosSeg, ax
  389.  
  390.     STI
  391.  
  392.     pop    ax
  393.     pop    es
  394.     assume    es:nothing
  395.  
  396.     ret
  397.  
  398. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  399.  
  400. init:    ; everything from here on is discarded
  401.  
  402.     push    es
  403.     xor    ax, ax
  404.     mov    es, ax
  405.     assume    es:Zseg
  406.  
  407.     mov    ax, KbdIntOff
  408.     mov    SaveKbdIntOff, ax
  409.     mov    ax, KbdIntSeg
  410.     mov    SaveKbdIntSeg, ax
  411.  
  412.     mov    ax, KbdBiosOff
  413.     mov    SaveKbdBiosOff, ax
  414.     mov    ax, KbdBiosSeg
  415.     mov    SaveKbdBiosSeg, ax
  416.  
  417.     pop    es
  418.     assume    es:nothing
  419.  
  420.     mov    es:brkSeg[bx], cs
  421.     mov    es:word ptr brkOff[bx], offset init
  422.  
  423.     jmp    exit
  424.  
  425. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  426.  
  427. Cseg    endS
  428.  
  429.     end    begin
  430.